package org.example.JUC.normal;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

/**
 * 错误的加锁逻辑
 * <p>
 * 理论上应该得到一个20000000的数字
 * 但是实际上只会得到一个比它小的数字
 * 因为这段程序并没有做到线程安全
 * 出现问题的主要原因是Integer属于不变对象，如果要修改的话，这个对象都得替换掉，故而加锁不是在通个对象上
 * 进而问题发生
 */
public class BadLockOnInteger implements Runnable {
    public static final int COUNT = 1000_0000;
    private static final BadLockOnInteger instance = new BadLockOnInteger();
    private static Integer i = 0;

    @Override
    public void run() {
        for (int j = 0; j < COUNT; j++) {
            synchronized (i) {
                i++;
            }
        }
    }

    @Test
    public void main() throws InterruptedException {
        Thread t1 = new Thread(instance);
        Thread t2 = new Thread(instance);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        Assertions.assertNotEquals(COUNT, i);
    }
}
